home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2000 #5
/
Amiga Plus CD - 2000 - No. 5.iso
/
Tools
/
Misc
/
InstallerNG
/
developer
/
gui
/
example
/
igui_AskChoice.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-10-31
|
6KB
|
186 lines
#include "includes.h"
#include "installergui_data.h"
/********************************************************************
*
* DESCRIPTION
*
* create and show the ASKCHOICE panel; this is a number of
* MX buttons and related labels; the localenv->fe_Choices
* is a List, which holds all the labels (every node->ln_Name)
* and the related bitnumber (node->ln_Pri). see the installer
* documentation for more infos about the sense of this bitnumber.
* you should only use the first 32 nodes of the localenv->fe_Choices
* list, because the long value, which you must return, has only
* 32 bits ;-)
*
* IN: application - pointer to the private application structure
* localenv - the local environment of the related ASKBOOL
* function
*
* OUT: a long value (see installer documentation, for how to build
* this value!)
*
*/
/********************************************************************
*
* STATIC
*
*/
static void __asm __saveds askchoice_hookfun(register __a2 APTR, register __a1 APTR *);
static const struct Hook askchoice_hook = { { NULL, NULL }, (VOID *) askchoice_hookfun, NULL, NULL };
/********************************************************************
*
* EXTERN
*
*/
/********************************************************************
*
* PUBLIC
*
*/
/********************************************************************
*
* CODE
*
*/
long __asm igui_AskChoice(register __a0 APTR application,
register __a1 struct FunctionEnvironment *localenv)
{
#ifdef DEBUG
DEBUG_MAKRO
#endif
{
struct Application *app = (struct Application *) application;
// the return value of this function
long retval = localenv->fe_Default;
// for later use
APTR innergroup,
// store all the radio-buttons here
choices[32],
// the new object
obj = GroupObject,
Child, TextObject,
MUIA_Frame, MUIV_Frame_None,
MUIA_Text_Contents, localenv->fe_Prompt,
MUIA_Text_SetMin, TRUE,
MUIA_Text_PreParse, "\33c",
End,
Child, innergroup = GroupObject,
MUIA_Group_Horiz, TRUE,
Child, HVSpace,
// here we will put the radio buttons later
End,
End;
// clear the choices array
int i;
for (i=0; i<32; i++) { choices[i] = NULL; }
if (!obj) { app->app_Error = GUIERROR_NO_GUI_OBJECT; }
else
{
// now dynamically create the labels and the radios and
// put them together into the inner group!
if (DoMethod(innergroup, MUIM_Group_InitChange))
{
int i,j;
char *label;
APTR radio;
struct Node *choicenode = sav_GetHead((struct List *) &(localenv->fe_Choices));
long num_choices = sav_ListLen((struct List *) &(localenv->fe_Choices)),
columns = num_choices/10 + 1,
rows = num_choices/columns,
choice_id;
// care for odd number of choices!
if (num_choices > (rows * columns)) { rows++; }
// go!
for (j=1; j<=columns; j++)
{
APTR choicelist = GroupObject,
MUIA_Group_Columns, 2,
Child, HVSpace,
Child, HVSpace,
End;
if (choicelist && DoMethod(choicelist, MUIM_Group_InitChange))
{
for (i=1; (i<=rows) && choicenode; i++)
{
// the node ln_Name holds the name, ln_Pri holds the related bit-number
label = choicenode->ln_Name;
choice_id = choicenode->ln_Pri;
choicenode = sav_GetSucc(choicenode);
DoMethod(choicelist, OM_ADDMEMBER, Label(label));
DoMethod(choicelist, OM_ADDMEMBER, radio = guistuff_InitRadio((retval==choice_id), FALSE));
// the hook
if (radio)
{
choices[choice_id] = radio;
SetAttrs(radio, MUIA_UserData, choice_id, TAG_DONE);
DoMethod(radio, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
MUIV_Notify_Self, 4, MUIM_CallHook, &askchoice_hook, &choices, &retval);
}
}
DoMethod(choicelist, OM_ADDMEMBER, HVSpace);
DoMethod(choicelist, OM_ADDMEMBER, HVSpace);
DoMethod(choicelist, MUIM_Group_ExitChange);
}
DoMethod(innergroup, OM_ADDMEMBER, choicelist);
}
// unteren space einfügen und fertig
DoMethod(innergroup, OM_ADDMEMBER, HVSpace);
DoMethod(innergroup, MUIM_Group_ExitChange);
}
// maybee BACK (if specified) or respect the swing mode
if (localenv->fe_Back) { guistuff_SetBackButton(app, TRUE); }
else if (!app->app_SWING_Mode) { igui_NameCancel(app, (char *) app->app_GlobalEnv[GENV_ABORT_BUTTON]); }
// add the content to the gui!
guistuff_NewContent(app, obj);
//
igui_WaitApp(app);
}
// and done
if (localenv->fe_Back) { guistuff_SetBackButton(app, FALSE); }
igui_EmptyPanel(app);
return(retval);
}
}
/********************************************************************/
static void __asm __saveds askchoice_hookfun(register __a2 APTR obj, register __a1 APTR *data)
{
// data[0] holds a pointer to the radio-array "choices"
// data[1] holds the address of the "retval"
SetAttrs(((APTR *) data[0])[*((ULONG *) data[1])], MUIA_Selected, FALSE, TAG_DONE);
GetAttr(MUIA_UserData, obj, (APTR) data[1]);
}